package algorithm;

import java.util.LinkedList;

import board.Board;

import interfaces.AlgorithmInterface;
import interfaces.Data;
import interfaces.Info;

public abstract class Algorithm implements AlgorithmInterface {
	
	protected Board initialState;
	protected Board finishState;
	protected Board lastState;
	
	/**
	 * Lista kroków obecnie przechodzonych
	 */
	protected LinkedList<Board.Way> steps;
	/**
	 * Lista wszystkichh kierunkówpotrzebna do iteracji
	 */
	protected LinkedList<Board.Way> directions;
	
	

	@Override
	public abstract Info solve(Board initialState);

	@Override
	public Board getActualState() throws AlgorithmEx {
		if(lastState == null)
			throw new AlgorithmEx("Jeszcze nie zainicjowany");
		return lastState;
	}
	protected void actualizeState(Board state){
		this.lastState = state;
	}

	@Override
	public Info getAlgorithmInfo() {
		//TODO Jeszcze nie zaimplemętowane
		return null;
	}
	/**
	 * Sprawdza jakość aktualnego ustawienia
	 * @param data aktualne ustawienie
	 * @return inta z jakością
	 */
	protected abstract int checkQuality(Board data);
	
	private Board getfinishState() {
		Board board = new Board(this.initialState.getHeight(), this.initialState.getWidth());
		
		return board;
	}

}
